package com.jcfk.system.service;

import cn.hutool.core.util.StrUtil;
import com.alibaba.druid.util.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jcfk.common.business.service.BaseService;
import com.jcfk.common.core.utils.BeanUtils;
import com.jcfk.common.security.utils.SecurityUtils;
import com.jcfk.common.web.domain.DataPage;
import com.jcfk.common.web.domain.RetResult;
import com.jcfk.system.dao.SysMessageTypeDao;
import com.jcfk.system.domain.dto.SysInternalMessageTypeDTO;
import com.jcfk.system.domain.dto.SysMessageTypeDTO;
import com.jcfk.system.domain.po.SysInternalMessageType;
import com.jcfk.system.domain.po.SysMessageSendUser;
import com.jcfk.system.domain.po.SysMessageType;
import com.jcfk.system.domain.po.SysUser;
import com.jcfk.system.domain.query.SysMessageTypeQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;
import java.util.stream.Collectors;

import static com.jcfk.common.core.utils.BeanUtils.convertList;

/**
 * 消息类别管理
 *
 * @author awei
 * @email 522891237@gqq.com
 * @date 2023-12-08
 */
@Service
public class SysMessageTypeService extends BaseService<SysMessageTypeDao, SysMessageType> {

    @Autowired
    private SysMessageSendUserService sysMessageSendUserService;

    @Autowired
    private SysUserService sysUserService;

    /**
     * SysMessageType分页查询
     *
     * @param page  分页设置
     * @param query 查询条件
     * @return 分页查询结果
     */
    public DataPage<SysMessageTypeDTO> queryByPage(DataPage<SysMessageTypeDTO> page, SysMessageTypeQuery query) {
        // 分页查询
        query.setTypeName(StringUtils.isEmpty(query.getTypeName()) ? query.getTypeName() :"%" + query.getTypeName() + "%");
        query.setTypeCode(StringUtils.isEmpty(query.getTypeCode()) ? query.getTypeCode() :"%" + query.getTypeCode() + "%");
        page = this.baseMapper.queryByPage(page, query);
        return page;
    }

    /**
     * 根据条件获取用户分页列表
     *
     * @param query 查询条件
     * @return 分页查询结果
     */
    public List<SysMessageTypeDTO> queryByPage(SysMessageTypeQuery query) {
        // 分页查询
        return this.baseMapper.queryByPage(query);
    }

    /**
     * 判断SysMessageType是已经存在
     *
     * @param dto
     * @return
     */
    public RetResult<String> isValid(SysMessageTypeDTO dto) {
        QueryWrapper<SysMessageType> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("deleted", 0);
        queryWrapper.eq("type_code", dto.getTypeCode());

        if (!StringUtils.isEmpty(dto.getId())) queryWrapper.ne("id", dto.getId());
        Integer count = this.count(queryWrapper);

        if (count > 0) return RetResult.fail("模板编码已存在");

        return RetResult.ok();
    }


    /**
     * 根据条件获取单表信息列表
     *
     * @param query 查询条件
     * @return List<SysMessageSendRecordDTO>
     */
    public List<SysMessageTypeDTO> getList(SysMessageTypeQuery query) {
        // 查询条件
        QueryWrapper<SysMessageType> qw = new QueryWrapper<>();
        qw.lambda().eq(SysMessageType::getDeleted,0);
        qw.lambda().eq(SysMessageType::getEnabled,1);
        // 查询数据
        List<SysMessageType> list = super.list(qw);

        return convertList(list, SysMessageTypeDTO.class);
    }


    /**
     * 插入消息类别管理
     *
     * @param dto 插入对象
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public void insert(SysMessageTypeDTO dto) {

        // 保存
        SysMessageType item = new SysMessageType();
        BeanUtils.copyProperties(dto, item);
        this.setDefaultValue(item);
        item.setSendPackageName(item.getMessageMode());
        super.save(item);

        List<SysMessageSendUser> sysMessageSendUsers = new ArrayList<>();

        // 内部消息
        if (dto.getMessageMode().equals("onSiteMessage") || dto.getMessageMode().equals("sendWeChat")) {
            if (!StringUtils.isEmpty(dto.getOrganizationId())) {
                SysMessageSendUser sysMessageSendUser = new SysMessageSendUser();
                sysMessageSendUser.setType(1);
                sysMessageSendUser.setTempleId(item.getId());
                sysMessageSendUser.setOrganizationId(dto.getOrganizationId());
                this.setDefaultValue(sysMessageSendUser);
                sysMessageSendUsers.add(sysMessageSendUser);
            }

            for (String userId : dto.getUserIds()) {
                SysMessageSendUser sysMessageSendUser = new SysMessageSendUser();
                sysMessageSendUser.setType(2);
                sysMessageSendUser.setTempleId(item.getId());
                sysMessageSendUser.setRecevieUserId(userId);
                this.setDefaultValue(sysMessageSendUser);
                sysMessageSendUsers.add(sysMessageSendUser);
            }

            for (String groupId : dto.getGroupId()) {
                SysMessageSendUser sysMessageSendUser = new SysMessageSendUser();
                sysMessageSendUser.setType(5);
                sysMessageSendUser.setTempleId(item.getId());
                sysMessageSendUser.setGroupId(groupId);
                this.setDefaultValue(sysMessageSendUser);
                sysMessageSendUsers.add(sysMessageSendUser);
            }
        }

        // 邮件
        if (dto.getMessageMode().equals("emailMessage")) {
            String[] emails = dto.getEmails().split("[,，;；]");
            List<String> emailList = Arrays.asList(emails);
            List<String> listWithoutDuplicates = emailList.stream().distinct().collect(Collectors.toList());
            for (String email : listWithoutDuplicates) {
                SysMessageSendUser sysMessageSendUser = new SysMessageSendUser();
                sysMessageSendUser.setType(3);
                sysMessageSendUser.setTempleId(item.getId());
                sysMessageSendUser.setEmail(email);
                this.setDefaultValue(sysMessageSendUser);
                sysMessageSendUsers.add(sysMessageSendUser);
            }
        }

        // 短信
        if (dto.getMessageMode().equals("phoneMessage")) {
            String[] phones = dto.getPhones().split("[,，;；]");
            List<String> emailList = Arrays.asList(phones);
            List<String> listWithoutDuplicates = emailList.stream().distinct().collect(Collectors.toList());
            for (String phone : listWithoutDuplicates) {
                SysMessageSendUser sysMessageSendUser = new SysMessageSendUser();
                sysMessageSendUser.setType(4);
                sysMessageSendUser.setTempleId(item.getId());
                sysMessageSendUser.setPhone(phone);
                this.setDefaultValue(sysMessageSendUser);
                sysMessageSendUsers.add(sysMessageSendUser);
            }
        }

        if (sysMessageSendUsers.size() > 0) sysMessageSendUserService.saveBatch(sysMessageSendUsers);
    }

    /**
     * 更新消息类别管理
     *
     * @param dto 更新对象
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public void update(SysMessageTypeDTO dto) {

        // 保存
        SysMessageType item = new SysMessageType();
        BeanUtils.copyProperties(dto, item);

        // 默认数据
        this.setDefaultValue(item);
        item.setSendPackageName(item.getMessageMode());


        // 修改接收人
        List<SysMessageSendUser> sysMessageSendUsers = new ArrayList<>();

        // 内部消息
        if (dto.getMessageMode().equals("onSiteMessage") || dto.getMessageMode().equals("sendWeChat")) {

            if (!StringUtils.isEmpty(dto.getOrganizationId())) {
                SysMessageSendUser sysMessageSendUser = new SysMessageSendUser();
                sysMessageSendUser.setType(1);
                sysMessageSendUser.setTempleId(item.getId());
                sysMessageSendUser.setOrganizationId(dto.getOrganizationId());
                this.setDefaultValue(sysMessageSendUser);
                sysMessageSendUsers.add(sysMessageSendUser);
            }

            for (String userId : dto.getUserIds()) {
                SysMessageSendUser sysMessageSendUser = new SysMessageSendUser();
                sysMessageSendUser.setType(2);
                sysMessageSendUser.setTempleId(item.getId());
                sysMessageSendUser.setRecevieUserId(userId);
                this.setDefaultValue(sysMessageSendUser);
                sysMessageSendUsers.add(sysMessageSendUser);
            }

            for (String groupId : dto.getGroupId()) {
                SysMessageSendUser sysMessageSendUser = new SysMessageSendUser();
                sysMessageSendUser.setType(5);
                sysMessageSendUser.setTempleId(item.getId());
                sysMessageSendUser.setGroupId(groupId);
                this.setDefaultValue(sysMessageSendUser);
                sysMessageSendUsers.add(sysMessageSendUser);
            }
        }

        // 邮件
        if (dto.getMessageMode().equals("emailMessage")) {
            item.setUrl("");
            String[] emails = dto.getEmails().split("[,，;；]");
            List<String> emailList = Arrays.asList(emails);
            List<String> listWithoutDuplicates = emailList.stream().distinct().collect(Collectors.toList());
            for (String email : listWithoutDuplicates) {
                SysMessageSendUser sysMessageSendUser = new SysMessageSendUser();
                sysMessageSendUser.setType(3);
                sysMessageSendUser.setTempleId(item.getId());
                sysMessageSendUser.setEmail(email);
                this.setDefaultValue(sysMessageSendUser);
                sysMessageSendUsers.add(sysMessageSendUser);
            }
        }

        // 短信
        if (dto.getMessageMode().equals("phoneMessage")) {
            item.setUrl("");
            String[] phones = dto.getPhones().split("[,，;；]");
            List<String> phoneList = Arrays.asList(phones);
            List<String> listWithoutDuplicates = phoneList.stream().distinct().collect(Collectors.toList());
            for (String phone : listWithoutDuplicates) {
                SysMessageSendUser sysMessageSendUser = new SysMessageSendUser();
                sysMessageSendUser.setType(4);
                sysMessageSendUser.setTempleId(item.getId());
                sysMessageSendUser.setPhone(phone);
                this.setDefaultValue(sysMessageSendUser);
                sysMessageSendUsers.add(sysMessageSendUser);
            }
        }

        super.updateById(item);

        QueryWrapper<SysMessageSendUser> wrapper = new QueryWrapper<>();
        wrapper.eq("temple_id", dto.getId());
        SysMessageSendUser sysMessageSendUser = new SysMessageSendUser();
        sysMessageSendUser.setDeleted(1);
        this.setDefaultValue(sysMessageSendUser);
        sysMessageSendUserService.update(sysMessageSendUser, wrapper);

        if (sysMessageSendUsers.size() > 0) sysMessageSendUserService.saveBatch(sysMessageSendUsers);

    }

    /**
     * 根据批量主键删除消息类别管理(逻辑删除)
     *
     * @param dto
     * @return bool
     */
    @Transactional(rollbackFor = Exception.class)
    public void logicDeleteList(SysMessageTypeDTO dto) {

        SysMessageType item = new SysMessageType();

        this.setDefaultValue(item);
        item.setDeleted(1);

        QueryWrapper<SysMessageType> queryWrapper = new QueryWrapper<>();
        queryWrapper.in("id", dto.getIds());

        this.update(item, queryWrapper);

        // 删除默认接收人
        QueryWrapper<SysMessageSendUser> wrapper = new QueryWrapper<>();
        wrapper.in("temple_id", dto.getIds());
        SysMessageSendUser user = new SysMessageSendUser();
        user.setDeleted(1);
        sysMessageSendUserService.update(user, wrapper);
    }

    /**
     * 设置添加默认值
     *
     * @param item 添加对象
     */
    public void setDefaultValue(SysMessageType item) {
        if (StrUtil.isEmpty(item.getCreatedUserId())) {
            item.setCreatedUserId(SecurityUtils.getUserId());
            item.setCreateTime(new Date());
        }
        item.setLastUpdatedUserId(SecurityUtils.getUserId());
        item.setLastUpdateTime(new Date());
        item.setDeleted(0);

    }

    /**
     * 根据主键获取消息类别管理信息
     *
     * @param id 主键
     * @return StandardCodeDTO
     */
    public SysMessageTypeDTO get(String id) {
        // 查询数据
        SysMessageType item = this.baseMapper.selectById(id);
        SysMessageTypeDTO dto = new SysMessageTypeDTO();
        try {
            BeanUtils.copyProperties(item, dto);
        } catch (RuntimeException e) {
            throw e;
        }

        // 默认接收人
        QueryWrapper<SysMessageSendUser> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(SysMessageSendUser::getTempleId, id).eq(SysMessageSendUser::getDeleted, 0);
        List<SysMessageSendUser> list = sysMessageSendUserService.list(queryWrapper);

        // 默认接收人 先关信息
        List<String> emails = new ArrayList<>();
        List<String> phones = new ArrayList<>();
        List<String> userIds = new ArrayList<>();
        List<String> groupids = new ArrayList<>();

        for (SysMessageSendUser user : list) {
            if (!StringUtils.isEmpty(user.getOrganizationId())) dto.setOrganizationId(user.getOrganizationId());
            if (!StringUtils.isEmpty(user.getRecevieUserId())) userIds.add(user.getRecevieUserId());
            if (!StringUtils.isEmpty(user.getGroupId())) groupids.add(user.getGroupId());

            if (!StringUtils.isEmpty(user.getEmail())) emails.add(user.getEmail());
            if (!StringUtils.isEmpty(user.getPhone())) phones.add(user.getPhone());
        }
        dto.setUserIds(userIds);
        dto.setGroupId(groupids);

        // 手机号 邮箱拼接
        String email = emails.stream().collect(Collectors.joining(";"));
        String phone = phones.stream().collect(Collectors.joining(";"));

        // 用户回显
        if (userIds.size() > 0) {
            QueryWrapper<SysUser> sysUserQueryWrapper = new QueryWrapper<>();
            sysUserQueryWrapper.select("id, first_name firstName").in("id", userIds);
            List<Map<String, Object>> users = sysUserService.listMaps(sysUserQueryWrapper);
            dto.setUsers(users);
        }

        dto.setEmails(email);
        dto.setPhones(phone);
        return dto;
    }


    /**
     * 设置添加默认值
     *
     * @param item 添加对象
     */
    public void setDefaultValue(SysMessageSendUser item) {
        if (StrUtil.isEmpty(item.getCreatedUserId())) {
            item.setCreatedUserId(SecurityUtils.getUserId());
            item.setCreateTime(new Date());
            item.setCreatedUserName(SecurityUtils.getUserName());
        }
        item.setLastUpdatedUserId(SecurityUtils.getUserId());
        item.setLastUpdateTime(new Date());
        item.setLastUpdatedUserName(SecurityUtils.getUserName());
    }


}

